"""
自定义文件存储后端，来构造完整的图片url返回
"""
# Storage默认的文件存储后端
from django.core.files.storage import Storage
from django.conf import settings
from fdfs_client.client import Fdfs_client
import os


class FastDFSStorage(Storage):

    def __init__(self, fdfs_base_url=None):
        # 构造方法，可以不带参数，也可以携带参数
        # base_url: Storage的IP
        self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL

    # TODO：用于本地上传
    def _open(self, name, mode='rb'):
        # 用于打开django本地文件作本地保存使用的，我们此处实现上传FastDFS，所以无需打开本地文件
        pass

    # TODO：用于二进制流上传
    def _save(self, name, file, max_length=None):
        # name是文件名称；file文件对象

        config_path = os.path.join(settings.BASE_DIR, "utils/client.conf")
        conn = Fdfs_client(config_path)

        return_dict = conn.upload_by_buffer(file.read())
        if not (return_dict and return_dict["Status"] == "Upload successed."):
            raise Exception("FastDFS上传图片失败")
        image = return_dict["Remote file_id"]

        # _save返回的结果就是ImageField类型字段存储在MySQL的内容
        return image

    def exists(self, name):
        # 功能：判断django本地是否已经存在该文件,避免重复保存
        # 此处我们是吧图片数据上传远程FastDFS，故无需判定是否存在
        return False    # 返回False表明，本地图片不存在，直接调用_save方法实现上传

    # 构造完整链接返回给浏览器用于访问图片
    def url(self, name):
        """
        功能：构建完整的图片文件url
        :param name: mysql中存储的文件索引id，比如：group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429
        :return: 完整的图片url
        """
        return self.fdfs_base_url + name
